package com.service.util;

import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.PropertyResourceBundle;
import java.util.StringTokenizer;

import org.w3c.dom.Document;

/**
 * 字符串的工具类
 * 
 * @author
 * 
 */

public class StringUtil {
	/** 加权因子 */
	@SuppressWarnings("unused")
	private static final int[] weight = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6,

	3, 7, 9, 10, 5, 8, 4, 2, 1 };

	/**
	 * 用指定的字符集编码URL
	 * 
	 * @param url
	 *            要编码的URL
	 * @param charset
	 *            字符集
	 * @return 编码后的URL
	 */
	public static String encodeURL(String url, String charset) {

		if (url != null && url.length() > 0) {
			try {
				return URLEncoder.encode(url, charset);
			} catch (UnsupportedEncodingException ex) {
				return url;
			}
		}
		return url;
	}

	/**
	 * 以指定的字符编码解析字符串的长度
	 * @param txt   要解析的字符串
	 * @param charset        编码
	 * @return 字符串的长度
	 */
	public static int getStrLength(String txt, String charset) {
		try {
			return txt.getBytes(charset).length;
		} catch (UnsupportedEncodingException ex) {
			return txt.length();
		}
	}
	
	/**
	 * 判断一个String对象是否为null，为null返回""，否则返回str自身。
	 * @param str            要判断的String对象 
	 * @return str自身或""
	 */
	public static String getPropertyValue(Object str) {
          return str==null?"":str.toString();
	}
	/**
	 * 
	 * 将一个byte数组转换为字符串
	 * @param arr           要转换的byte数组
	 * @return 转换好的字符串，如果数组的length=0，则返回""。
	 */
	public static String bytetoString(byte[] arr) {
		String str = "";
		String tempStr = "";
		for (int i = 1; i < arr.length; i++) {
			tempStr = (Integer.toHexString(arr[i] & 0xff));
			if (tempStr.length() == 1) {
				str = str + "0" + tempStr;
			} else {
				str = str + tempStr;
			}
		}
		return str;
	}

	/**
	 * 分析一个字符串,得到一个整数,如果错误,设置为缺省值-1.
	 * @param str1        String
	 * @return int
	 */
	public static int myparseInt(String str1) {
		return myparseInt(str1, -1);
	}
	/**
	 * 分析一个字符串,得到一个整数,如果错误,设置为缺省值. 如果一个字符串以0x开头,则认为是16进制的.
	 * @param str1           字符串
	 * @param nDefault           缺省值
	 * @return int
	 */
	public static int myparseInt(String str1, int nDefault) {
		int result;
		try {
			if (isBlank(str1)) {
				result = nDefault;
			} else {
				// 16进制
				if (str1.startsWith("0x")) {
					String sLast = str1.substring(2);
					result = Integer.parseInt(sLast, 16);
				} else {
					result = Integer.parseInt(str1);
				}
			}
		} catch (NumberFormatException e) {
			result = nDefault;
		}
		return result;
	}

	/**
	 * 
	 * 分析一个字符串得到Long,如果错误,返回null .
	 * @param str1           字符串
	 * @return Long
	 */
	public static Long myparseLongObj(String str1) {
		try {
			if (isBlank(str1)) {
				return null;
			} else {
				// 16进制
				if (str1.startsWith("0x")) {
					String sLast = str1.substring(2);
					return Long.valueOf(sLast, 16);
				} else {
					return Long.valueOf(str1);
				}
			}
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * 格式化数字:返回定长的字符串.
	 * @param aNum           格式化的数字
	 * @param aLength           长度
	 * @return 格式化好的字符串.
	 */
	public static String formatNumber(int aNum, int aLength) {
		String sNum = Integer.toString(aNum);
		int nLength = aLength - sNum.length();
		if (nLength < 1) {
			return sNum;
		}
		for (int i = 1; i <= nLength; i++) {
			sNum = "0" + sNum;
		}
		return sNum;
	}
	
	/**
	 * 根据格式输出浮点数的字符串.
	 * @param aFloat            浮点数
	 * @param nSyo            字符串格式,参考NumberFormat的说明.
	 * @return String
	 */
	public static String getShowFloat(float aFloat, String nSyo) {
		NumberFormat astr = NumberFormat.getInstance();
		((DecimalFormat) astr).applyPattern(nSyo);
		return astr.format(aFloat);
	}
	
	/**
	 * 从属性里面读取一个字符串出来,如果空,返回缺省值.
	 * @param aPROP            属性句柄
	 * @param itemName            属性名称
	 * @param sDefault           缺省值
	 * @return String
	 */
	public static String getPROPString(PropertyResourceBundle aPROP,
	String itemName, String sDefault) {
		String aValue = "";
		try {
			if (null != aPROP) {
				aValue = aPROP.getString(itemName);
			}
		}catch (Exception e) {
			// donothing
		}
		if (isBlank(aValue)) {
			aValue = sDefault;
		}
		return aValue;
	}
	
	/** 
	 * 字符串是否为空:null或者长度为0.
	 * @param astr           源字符串.
	 * @return boolean
	 */
	public static boolean isBlank(String astr) {
		return ((null == astr) || (astr.length() == 0));
	}


	/**
	 * 拆分字符串为一维字符串数组
	 * @param str       要拆分的字符串
	 * @param sign      字符串拆分的标识符
	 * @return strData 拆分后的一维字符串数组
	 */
	public static String[] splitStrToArray(String str, String sign) {
		String[] strData = null;
		StringTokenizer st1 = new StringTokenizer(str, sign);
		strData = new String[st1.countTokens()];
		int i = 0;
		while (st1.hasMoreTokens()) {
			strData[i] = st1.nextToken().trim();
			i++;
		}
		return strData;
	}
	
	/**
	 * 将字节进行 KB MB GB换算
	 * @param size
	 *            字节数
	 * @return 换算后的字符串
	 */
	public static String changeCapacities(long size) {
		long returns = 0;
		String den = "B";
		if (size < 1024) {
			returns = size;
		} else if (size >= 1024 && size < 1048576) {
			returns = size / 1024;
			den = "KB";
		} else if (size >= 1048576 && size < 1073741824) {
			returns = size / 1024 / 1024;
			den = "MB";
		} else {
			returns = size / 1024 / 1024 / 1024;
			den = "GB";
		}
		return new String(returns + den);
	}
//	public static Document getDocument(String message) {
//		Document doc = null;
//		SAXReader reader = new SAXReader();
//		try {
//			doc = reader.read(new ByteArrayInputStream(message
//			.getBytes("utf-8")));
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return doc;
//	}
	
	/**
	 * 用sign分隔字符串data(不判断data是否带有双引号的)
	 * @param data          要拆分的字符串 
	 * @param sign           分隔符
	 * @return list 分隔后的List
	 */
	public static List<String> spit(String data, String sign) {
		StringTokenizer stkzer = new StringTokenizer(data, sign);
		String temp = null;
	    List<String> list = new ArrayList<String>();
		while (stkzer.hasMoreTokens()) {
			temp = stkzer.nextToken();
			list.add(temp);
		}
		return list;
	}
	
}
